<script>
    let flatArr = [
        {
            "id": 1,
            "name": "北京",
            "parentId": 0
        },
        {
            "id": 4,
            "name": "合肥",
            "parentId": 2
        },
        {
            "id": 8,
            "name": "全椒",
            "parentId": 5
        },
        {
            "id": 5,
            "name": "滁州",
            "parentId": 2
        },
        {
            "id": 2,
            "name": "安徽",
            "parentId": 0
        },
        {
            "id": 6,
            "name": "南京",
            "parentId": 3
        },
        {
            "id": 7,
            "name": "苏州",
            "parentId": 3
        },
        {
            "id": 3,
            "name": "江苏",
            "parentId": 0
        }
    ]

    // 扁平数据转换成树形,先找父节点,还得区分1级的节点
    // 每条数据只会有一条根数据

    // currentKey:当前节点的字段标识(属性名)
    // parentKey:父节点的字段标识(属性名)
    // childrenKey:子节点的字段标识(子节点的字段名,属性名)
    function toTree(data, currentKey = 'id', parentKey = 'parentId', childrenKey = 'children') {
        // 储存树形数据的数组
        let treeArr = []
        // 再次声明一个函数
        function recursion(data) {
            data.forEach(item => {
                // 说明这个是一个子节点
                if (item[parentKey]) {
                    // 找父节点
                    let parent = data.find(p => p[currentKey] == item[parentKey])
                    // 判断父节点是否有children属性
                    if (!parent[childrenKey]) {
                        // 添加一个children属性,并且是一个数组
                        parent[childrenKey] = []
                    }
                    parent[childrenKey].push(item)
                } else {
                    treeArr.push(item)
                }
            })
        }
        recursion(data)
        return treeArr
    }

    let res = toTree(flatArr)
    console.log(res);

</script>